package com.example.demo.controller.system;

import com.example.demo.common.page.PageResult;
import com.example.demo.common.result.R;
import com.example.demo.dto.system.BatchOrderDTO;
import com.example.demo.dto.system.SubsystemQueryDTO;
import com.example.demo.entity.system.SysSubsystem;
import com.example.demo.service.system.SysSubsystemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 子系统管理控制器
 */
@RestController
@RequestMapping("/api/subsystems")
public class SysSubsystemController {
    
    @Autowired
    private SysSubsystemService subsystemService;
    
    /**
     * 获取子系统列表
     */
    @GetMapping("/list")
    public R<List<SysSubsystem>> list(SysSubsystem subsystem) {
        List<SysSubsystem> list = subsystemService.selectSubsystemList(subsystem);
        return R.ok(list);
    }
    
    /**
     * 分页查询子系统列表
     */
    @GetMapping
    public R<PageResult<SysSubsystem>> page(SubsystemQueryDTO queryDTO) {
        PageResult<SysSubsystem> pageResult = subsystemService.selectSubsystemPage(queryDTO);
        return R.ok(pageResult);
    }
    
    /**
     * 获取子系统详细信息
     */
    @GetMapping("/{systemCode}")
    public R<SysSubsystem> getInfo(@PathVariable("systemCode") String systemCode) {
        SysSubsystem subsystem = subsystemService.selectSubsystemByCode(systemCode);
        if (subsystem == null) {
            return R.fail("子系统不存在");
        }
        return R.ok(subsystem);
    }
    
    /**
     * 新增子系统
     */
    @PostMapping
    public R<SysSubsystem> add(@RequestBody SysSubsystem subsystem) {
        // 校验系统编码是否唯一
        if (!subsystemService.checkSystemCodeUnique(subsystem.getSystemCode())) {
            return R.fail("系统编码已存在");
        }
        
        // 设置默认值
        if (subsystem.getStatus() == null) {
            subsystem.setStatus(1);
        }
        if (subsystem.getIsVisible() == null) {
            subsystem.setIsVisible(1);
        }
        if (subsystem.getOrderNum() == null) {
            subsystem.setOrderNum(0);
        }
        
        int rows = subsystemService.insertSubsystem(subsystem);
        if (rows > 0) {
            return R.ok(subsystem);
        }
        return R.fail("添加失败");
    }
    
    /**
     * 修改子系统
     */
    @PutMapping("/{systemCode}")
    public R<Void> edit(@PathVariable("systemCode") String systemCode, @RequestBody SysSubsystem subsystem) {
        // 检查子系统是否存在
        SysSubsystem existSubsystem = subsystemService.selectSubsystemByCode(systemCode);
        if (existSubsystem == null) {
            return R.fail("子系统不存在");
        }
        
        subsystem.setSystemCode(systemCode);
        int rows = subsystemService.updateSubsystem(subsystem);
        return rows > 0 ? R.ok() : R.fail("修改失败");
    }
    
    /**
     * 修改子系统状态
     */
    @PutMapping("/{systemCode}/status")
    public R<Void> changeStatus(@PathVariable("systemCode") String systemCode, @RequestBody Map<String, Integer> params) {
        // 检查子系统是否存在
        SysSubsystem existSubsystem = subsystemService.selectSubsystemByCode(systemCode);
        if (existSubsystem == null) {
            return R.fail("子系统不存在");
        }
        
        Integer status = params.get("status");
        if (status == null || (status != 0 && status != 1)) {
            return R.fail("状态值无效");
        }
        
        int rows = subsystemService.updateSubsystemStatus(systemCode, status);
        return rows > 0 ? R.ok() : R.fail("状态修改失败");
    }
    
    /**
     * 修改子系统显示顺序
     */
    @PutMapping("/order")
    public R<Void> changeOrder(@RequestBody BatchOrderDTO orderDTO) {
        int rows = subsystemService.updateSubsystemOrder(orderDTO);
        return rows > 0 ? R.ok() : R.fail("排序修改失败");
    }
    
    /**
     * 删除子系统
     */
    @DeleteMapping("/{systemCode}")
    public R<Void> remove(@PathVariable("systemCode") String systemCode) {
        // 检查子系统是否存在
        SysSubsystem existSubsystem = subsystemService.selectSubsystemByCode(systemCode);
        if (existSubsystem == null) {
            return R.fail("子系统不存在");
        }
        
        int rows = subsystemService.deleteSubsystemByCode(systemCode);
        return rows > 0 ? R.ok() : R.fail("删除失败");
    }
    
    /**
     * 批量删除子系统
     */
    @DeleteMapping("/batch/{codes}")
    public R<Void> batchRemove(@PathVariable("codes") String[] codes) {
        int rows = subsystemService.deleteSubsystemByCodes(codes);
        return rows > 0 ? R.ok() : R.fail("批量删除失败");
    }
    
    /**
     * 获取子系统统计信息
     */
    @GetMapping("/statistics")
    public R<Map<String, Object>> statistics() {
        Map<String, Object> stats = subsystemService.getSubsystemStatistics();
        return R.ok(stats);
    }
} 